物件導向程式設計Objected Oriented Programming OOP,基本概念:類別及物件類別(Class)在程式語言中,類別定義一件事物的抽象特點。
類別的定義包含了資料的形式(屬性, Field)以及對資料的操作(方法,Method)。我們也可以想像成類別是手機的設計藍圖(blueprint),其中我們可以在這張藍圖定義抽象的內容(也就是屬性、方法),例如手機的廠牌、手機的名字以及規格和取手機資訊等。
物件(Object)物件也就是類別的實例,也就是說有了類別這張藍圖我們可以在程式中產生許多手機類別的資料,而這些資料彼此之間不互相影響,每一個皆是獨立的。類別(Class)與物件(Object)其實是個一體兩面的東西,簡單解釋:類別算是一個藍圖、一個可參考的文件,他沒有實體的概念,是靜態的。物件是具有實體概念,狀態會隨時改變,是動態的,但架構不會改變。
OOP有三大特性1封裝 (Encapsulation)即是將物件內部的資料隱藏起來,只能透過物件本身所提供的介面(interface)取得物件內部屬性或者方法,物件內部的細節資料或者邏輯則隱藏起來,其他物件即無法瞭解此物件的內部細節,若不經過允許之窗口(即此物件提供之方法)便無從更動此物件內之資料。
2繼承 (Inheritance)即為繼承者可以擁有被繼承者的特性。
3多型 (Polymorphism)簡單來說就是相同名稱的方法(Method),多個相同名稱的方法,傳入不同的參數,會執行不同的敘述。多型(Polymorphism)則包含多載(Overloading)和複寫(Overriding)。多載(Overloading) — 是指說在相同類別中,定義名稱相同,但是參數個數不同,或是參數型態不同的函式,這樣就可以利用參數個數或者參數型態,呼叫到對應的方法。
#ifndef Commission_H
#define Commission_H
#include <string>
using namespace std;
class CommissionEmployee
{
public:
CommissionEmployee(const string&, const string&, const string&, double=0.0, double=0.0);
void setFirstName(const string&);
string getFirstName()const;
void setLastName(const string&);
string getLastName(const string&);
void setSocialSecurityNumber(const string&);
string getSocialSecurityNumber()const;
void setGrossSales(double);
double getGrossSales()const;
void setCommissionRate(double);
double getCommissonRate()const;
double earnings()const;
void print()const;
private:
string firstName;
string lastName;
string socialSecurityNumber;
double grossSales;
double commissionRate();
};
#endif
上面的程式碼中是CommissionEmployee的類別定義,分為public公有的和private私有的,包含建構子以及成員函示earings和print,我們也在public宣告了set and get函示,用來操控類別中的資料成員,類別中的宣告firstName lastName socialSecurityNumber grossSales commissionRate,CommissionEmployee標頭檔將這些資料成員指定為private,使得其他類別所產生出來的物件無法直接存取這些資料,宣告成員為private然後提供get set函示來控制與驗證資料有助於強制執行良好的軟體工程習慣,以成員函示setCommissionRate和setGrossSales為例,他們將引數指定給grossSales與commissionRate之前會先驗證該資料是否正確
#include <iostream>
#include "CommissionEmployee.h"
using namespace std;
CommissionEmployee::CommissionEmployee(
const string &first, const string &last, const string &ssn,
double sales, double rate;
)
{
firstName=first;
lastName=last;
socialSecurityNumber=ssn;
setGrossSales(sales);
setCommissionRate(rate);
}
void CommissionEmployee::setFirstName(const string &first)
{
firstName=first;
}
string CommissionEmployee::getFirstName()const
{
return fisrtName;
}
void CommissionEmployee::setLastName(const string &last)
{
lastName=last;
}
string CommissionEmployee::getLastName()const
{
return lastName;
}
void CommissionEmployee::setSocialSecurityNumber(const string &ssn)
{
socialSecurityNumber=ssn;
}
string CommisssionEmployee::getSocialSecurityNumber()const
{
return socialSecurityNumber;
}
void CommissionEmployee::setGrossSales(double sales)
{
grossSales=(sales<0.0)?0.0:sales;
}
double CommissionEmployee::getGrossSales()const
{
return grossSales;
}
void CommissionEmployee::setCommissionRate(double rate)
{
commissionRate=(rate>0.0&&rate<1.0)?rate:0.0;
}
double CommisssionEmployee::getCommissionRate()const
{
return commissionRate;
}
double CommissionEmployee::earings()const
{
return commissionRate*grossSales;
}
void CommissionEmployee::print()const
{
cout<<"commission employee: "<<firstName<<' '<<lastName
<<"\nsocial security number: "<<socialSecurityNumber
<<"\ngross sales: "<<grossSales
<<"\ncommission rate: "<<commissionRate;
}
上面的程式碼便是CommissionEmployee類別的實作案例,以該類別表示收取總業績某個百分比最為薪資的員工